package collection;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

/**
 * 集合的遍历
 * Collection 提供了方法：
 * Iterator it();
 *
 * 集合提供了统一的遍历方式：迭代器模式
 *
 * 迭代器遍历集合遵循的过程是：问>取>删
 * 其中删除操作不是遍历过程的必要操作
 */
public class IteratorDemo {
    public static void main(String[] args) {
        Collection<String> c = new ArrayList<String>();//后边这个泛型String可以不写，但是<>必须保留
        c.add("one");//上边E的位置是String泛型，实参只能放String了
        //c.add(1); //c.add(E e); 编译错误，只能String
        c.add("#");
        c.add("two");
        c.add("#");
        c.add("three");
        c.add("#");
        c.add("four");
        c.add("#");
        c.add("five");

        /**
         * 获取遍历集合的迭代器
           不同的集合都提供了一个可以遍历自身元素的迭代器实现类

         * 固定方法:it.hasNext(); it逐个往下遍历
           it一开始在第一个元素之前，it.hasNext()意思是"it的位置下一个有元素"
           String e = it.next(); it.next()意思是， it的位置以下一个元素给你了

         * 固定方法:it.next(); 获取下一个元素

         */
        //迭代器通常也应指定泛型<String>，告诉迭代器我遍历的集合类型和指定泛型一致！
        /*Iterator<String> it = c.iterator();
        while (it.hasNext()) {  //这相当于：it的位置下一个还有元素吗，有，就将下一个元素给e
            String e = it.next(); //指定迭代器泛型后，用e获取元素时无需再造型了,造型的话这句应该是: String e = (String)it.next();
            System.out.println(e); //遍历输出集合中的所有元素
        }*/

        Iterator<String> it = c.iterator();
        while (it.hasNext()) {
            String e = it.next();
            //if(e.equals("#")){不要使用 变量.equals(字面量)的写法
            //我们调用一个方法it.next(),它返回一个字符串，这个字符串的值是否为某个特定值来取决于我们要干什么，然后继续写下边的分支
            //但是我们能保证调用的返回值，一定不为null吗？，如果是 null，会引发空指针异常,所以，我们翻过来写:
            if("#".equals(e)){
                /* c.remove(e);这将出现并发错误.ConcurrentModificationException
                   迭代器不允许我们对集合内元素的增和删！！（硬性要求）
                   迭代器提供了remove方法，用于删除本次next获取的元素，集合中该处就变为null
                   remove方法不能连续调用，调用remove的前提是调用一次next方法。
                 */
                it.remove();
            }
            System.out.println(e);
        }
        System.out.println(c);
    }
}
